spring boot自动配置与启动流程分析

spring boot自动配置与启动流程分析


 我们先了解一下spring的注解@Controller、@Repository、@Service与@Component的关系:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {

	/**
	 * The value may indicate a suggestion for a logical component name,
	 * to be turned into a Spring bean in case of an autodetected component.
	 * @return the suggested component name, if any (or empty String otherwise)
	 */
	@AliasFor(annotation = Component.class)
	String value() default "";

}

   @Controller、@Repository以及@Service的注解都是一样的,其上都有@Component, 目前spring版本对这个几个 个注解的功能没区别,都 @Component的别名。其实我们可以自己定义注解,如:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface MyController {

}
 
 这样带有注解
@MyController的类也可以被spring实例化,放到spring容器中托管。其实spring boot也是类似手法。
 spring boot的注解@SpringBootApplication、@SpringBootConfiguration、@EnableAutoConfiguration等等都是些
复合注解,一个注解组合了多种基本注解的功能,比如:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	String[] excludeName() default {};

}
 
 @EnableAutoConfiguration就有组合注解@AutoConfigurationPackage。这些注解的功能大多依赖  spring 的 @Import,此注解上的类表示 其注解功能的实现。现在我们看看spring boot的自动配置在启动流程哪些关键之处起作用的。

  经debug,整理了一些spring boot 启动的流程(并没有很全面):空间太小了,图画的不是很好:


     在线版:http://on-img.com/chart_image/5a600665e4b010a6e720bf6b.png

或git地址。(右键新标签打开该图片可以放大查看)

    图上其实都加上了部分注解,下面拿些我认为重要的说一下:


package com.sdcuike.springboot.practice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author sdcuike
 * @date 2018/01/17
 * @since 2018/1/17
 */
@SpringBootApplication
public class SpringApplicationBoot {
    public static void main(String[] args) {

        SpringApplication.run(SpringApplicationBoot.class, args);

    }
}
   上面几行代码加一个注解@SpringBootApplication,就可以启动spring boot 应用,代码

SpringApplication.run(SpringApplicationBoot.class, args);
   主要实现的功能如图所示:

   
 

      其中包括了spring 容器的初始化功能。功能4表示根据判断的应用类型创建相应的spring 容器,在作者这里是web应用,所以是AnnotationConfigServletWebServerApplicationContext,此容器默认的构造函数实现的功能如下图所示:



这个容器主要注册和注解相关的post processors实例,大部分都是BeanFactoryPostProcessor及BeanPostProcessor的子类。主要处理spring的注解@Configuration、 @Autowired、@Value、@Injec、 @Required、 @PostConstruct、@PreDestroy 、

 @EventListener等等。其中ConfigurationClassPostProcessor 处理 带有注解@Configuration的类。

这些和注解相关的post processors实例的功能处理主要由org.springframework.context.support

.AbstractApplicationContext#invokeBeanFactoryPostProcessors调用:



功能如上图所示,而且spring boot的注解@EnableAutoConfiguration中的

@Import(AutoConfigurationImportSelector.class)开始加载spring boot约定好的自动配置类。以后的流程是经典的spring容器实例化类的流程,不在叙述了。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Spring Boot自动配置原理是通过在类路径中搜索特定的类,并根据它们发现的内容自动配置应用程序。它使用@EnableAutoConfiguration注解和@Configuration注解将类路径中的类和jar文件与Spring应用程序上下文进行关联。 ### 回答2: Spring Boot自动配置原理是通过条件注解实现的。 Spring Boot在启动时会通过@SpringBootApplication注解扫描类路径下的所有组件,并自动配置这些组件的实例。在自动配置过程中,Spring Boot使用了条件注解来判断是否需要配置某个组件。 条件注解可以根据一些条件来决定是否启用某个组件的配置。例如,@ConditionalOnClass注解可以根据类路径下是否存在指定的类来决定是否启用某个组件的配置。@ConditionalOnProperty注解可以根据配置文件中的属性值来决定是否启用某个组件的配置。 在自动配置过程中,Spring Boot会通过条件注解判断是否需要配置某个组件,如果需要配置,则会根据组件的配置类和属性值创建对应的实例。如果没有需要配置的组件,Spring Boot会跳过自动配置过程。 通过自动配置Spring Boot简化了应用的搭建过程,减少了开发人员的配置工作。开发人员只需要在配置文件中设置一些属性,或者添加一些指定的依赖,Spring Boot就能根据这些信息自动配置应用所需的组件。 总之,Spring Boot自动配置原理是通过条件注解来判断是否需要配置某个组件,根据配置类和属性值创建对应的实例,从而简化了应用的配置过程。这个原理使得开发人员能够更加专注于业务逻辑的开发,提高了开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dreamer who

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值